home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / GNU_C++ / LIB / CFLIB-11.LZH / src / file.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-04-08  |  5.6 KB  |  303 lines

  1. /*
  2.  * file.c
  3.  *
  4.  * Funktionen auf das Dateisystem.
  5. */
  6. #include <ctype.h>
  7. #ifdef __MINT__
  8. #include <stat.h>
  9. #include <support.h>
  10. #else
  11. #include <ext.h>
  12. #define S_IFMT            0170000
  13. #define S_IFDIR        0040000
  14. #define S_ISDIR(m)    ((m & S_IFMT) == S_IFDIR)
  15. #endif
  16.  
  17. #include "intern.h"
  18.  
  19.  
  20. int file_exists(char *filename)
  21. {
  22.     struct stat    s;
  23.     
  24.     if (filename[0] == EOS)
  25.         return FALSE;
  26.     return (stat(filename, &s) == 0);
  27. }
  28.  
  29. int path_exists(char *pathname)
  30. {
  31.     struct stat    s;
  32.     int            r = FALSE;
  33.     
  34.     if (pathname[0] != EOS)
  35.     {
  36.         if ((stat(pathname, &s) == 0) && S_ISDIR(s.st_mode))
  37.             r = TRUE;
  38.  
  39.         /* Work-around für MagiCPC, wo der stat(<Laufwerk>) nicht funkt! */
  40.         if (cf_magxPC && !r)
  41.         {
  42.             int    len = (int)strlen(pathname);
  43.  
  44.             if (pathname[1] == ':' && len <= 3)    /* nur Laufwerk 'X:' oder 'X:\' */
  45.             {
  46.                 char    p[80];
  47.  
  48.                 /* Laufwerk existiert, wenn man das akt. Verzeichnis ermitteln kann */            
  49.                 if (Dgetpath(p, toupper(pathname[0]) - 64) == 0)
  50.                     r = TRUE;
  51.             }
  52.         }
  53.     }
  54.     return r;
  55. }
  56.  
  57. int get_path(char *path, char drive)
  58. {
  59.     int     ret, drive_nr;
  60.  
  61.     if (drive == 0)
  62.     {
  63.         drive = 'A' + Dgetdrv();                    /* Aktuelles Laufwerk */
  64.         if (drive > 'Z')
  65.             drive = drive - 'Z' + '0';
  66.     }
  67.     else
  68.         drive = toupper(drive);
  69.     if (drive >= '1' && drive <= '6')            /* Laufwerk nach Z mit Big-DOS oder MetaDOS > 2.60 */
  70.         drive_nr = drive - '1' + 26;
  71.     else
  72.         drive_nr = drive - 'A';
  73.     path[0] = drive;
  74.     path[1] = ':';
  75.     ret = Dgetpath (path + 2, drive_nr + 1);
  76.     strcat (path, "\\");
  77.     
  78.     if (fs_case_sens(path) == NO_CASE)
  79.         str_toupper(path);
  80.  
  81.     return (ret == 0);
  82. }
  83.  
  84. int set_path(char *path)
  85. {
  86.     int    drive, ret;
  87.  
  88.     if (path[0] == EOS)
  89.         return FALSE;
  90.  
  91.     path[0] = toupper(path[0]);
  92.     if (path[0] >= '1' && path[0] <= '6')
  93.         drive = path[0] - '1' + 26;
  94.     else
  95.         drive = path[0] - 'A';
  96.     Dsetdrv(drive);
  97.     ret = Dsetpath(path + 2);
  98.     return (ret == 0);
  99. }
  100.  
  101. void split_filename(char *fullname, char *path, char *name)
  102. {
  103.     char    *str;
  104.  
  105.     str = strrchr (fullname, '\\');
  106.  
  107.     if (path != NULL)
  108.         path[0] = EOS;        /* schadet nix */
  109.     if (name != NULL)
  110.         name[0] = EOS;        /* ditto */
  111.  
  112.     if (str != NULL)
  113.     {
  114.         /* Dateinamen holen */
  115.         if (name != NULL)
  116.             strcpy(name, str+1);
  117.  
  118.         /* Pfad mit Laufwerk bestimmen */
  119.         if (path != NULL)
  120.         {
  121.             int len =  (short)( str - (char *)fullname + 1);
  122.             
  123.             strncpy(path, fullname, len);
  124.             path[len] = EOS;
  125.         }
  126.     }
  127. }
  128.  
  129. void set_extension(char *filename, char *new_ext)
  130. {
  131.     char    *ptr;
  132.  
  133.     ptr = strrchr(filename,'.');
  134.     if (ptr == NULL || ptr < strrchr(filename,'\\'))
  135.     {
  136.         ptr = filename + strlen(filename);
  137.         *ptr = '.';
  138.     }
  139.  
  140.     if (fs_case_sens(filename) == NO_CASE)
  141.     {
  142.         char    myext[5];
  143.  
  144.         strcpy(myext, new_ext);
  145.         str_toupper(myext);
  146.         strcpy(ptr+1, myext);
  147.     }
  148.     else
  149.         strcpy(ptr + 1, new_ext);
  150. }
  151.  
  152. int make_normalpath(char *path)
  153. {
  154.     int    i;
  155.     char    p[256];
  156.     char    *f, drv;
  157.     int    ret;
  158.  
  159.     if (path[0] == EOS)
  160.         return FALSE;
  161.  
  162. #ifdef __MINT__
  163.     if (path[0] == '/')                /* UNIX-Pfad */
  164.     {
  165.         unx2dos(path, p);
  166.         strcpy(path, p);
  167.     }
  168. #endif
  169.  
  170.     /* Laufwerk bestimmen */
  171.     if (path[1] != ':')                 /* Kein Laufwerk */
  172.     {
  173.         drv = 'A' + Dgetdrv();        /* aktuelles Laufwerk */
  174.         if (drv > 'Z')
  175.             drv = drv - 'Z' + '0';    /* A..Z 1..6 */
  176.         f = path;
  177.     }
  178.     else
  179.     {
  180.         path[0] = toupper(path[0]);
  181.          drv = path[0];
  182.         if (drv > 'Z')
  183.             drv = drv - 'Z' + '0';    /* A..Z 1..6 */
  184.          f = path + 2;
  185.     }
  186.     /* Pfad mit Laufwerk bestimmen */
  187.     if (f[0]=='.' && (f[1]=='\\' || f[1]==EOS))
  188.     {
  189.         get_path(p, drv);             /* aktuellen Pfad nehmen */
  190.         if (f[1]=='\\') 
  191.             strcat(p,f+2);
  192.     }
  193.     else if (f[0]!='\\')             /* Keine Root */
  194.     {
  195.         get_path(p, drv);
  196.         strcat (p, f);
  197.     }
  198.     else
  199.     {
  200.         p[0] = drv;
  201.         p[1] = ':';
  202.         p[2] = EOS;
  203.         strcat (p, f);
  204.     }
  205.  
  206.     i = (int)strlen(p);
  207.     if (p[i-1] != '\\')
  208.     {
  209.         p[i] = '\\';
  210.         p[i+1] = EOS;
  211.     }
  212.  
  213.     ret = path_exists(p);
  214.     if (!ret)
  215.         p[i] = EOS;
  216.  
  217.     strcpy(path,p);
  218.     return ret;
  219. }
  220.  
  221. void make_shortpath(char *path, char *shortpath, int maxlen)
  222. {
  223.     char    help[256];
  224.     int    path_len;
  225.     char    *p1, *p2;
  226.  
  227.     strcpy(help, path);
  228.     path_len = (int)strlen(help);
  229.     if (maxlen < 18)
  230.         split_filename(path, NULL, help);
  231.     else if (path_len > maxlen)
  232.     {
  233.         p1 = strchr(help, '\\');
  234.         p2 = p1;
  235.         path_len += 2;                 /* zwei Punkte neu */
  236.         while(*p2 != EOS && path_len > maxlen)
  237.         {
  238.             p2++;
  239.             while(*p2 != '\\' && *p2 != EOS)
  240.             {
  241.                 p2++;
  242.                 path_len--;
  243.             }
  244.         }
  245.         if (*p2 != EOS)
  246.         {
  247.             memmove(p1 + 3, p2, strlen(p2) + 1);
  248.             p1[1] = '.';
  249.             p1[2] = '.';
  250.         }
  251.         else
  252.         {
  253.             p2 = strrchr(help, '\\');
  254.             memmove(help, p2, strlen(p2) + 1);
  255.         }
  256.     }
  257.     strcpy(shortpath, help);
  258. }
  259.  
  260. int fs_long_name(char *filename)
  261. {
  262.     char    path[256];
  263.     long    ret;
  264.  
  265.     /* eigentlichen Dateinamen abschneiden und durch '.' ersetzen -
  266.         muß sein, da Datei evtl. noch nicht existiert... */
  267.     split_filename(filename, path, NULL);
  268.     strcat(path, ".");
  269.     ret = Dpathconf(path, 3);
  270.     if ((ret < 0) || (ret == 12))
  271.         ret = 0;
  272.     return (int) ret;
  273. }
  274.  
  275. int fs_case_sens(char *filename)
  276. {
  277.     char    path[256];
  278.     int    ret;
  279.  
  280.     /* Eigentlichen Dateinamen abschneiden und durch '.' ersetzen -
  281.         muß sein, da Datei evtl. noch nicht existiert... */
  282.     split_filename(filename, path, NULL) ;
  283.     strcat(path, ".") ;
  284.     ret = (int)Dpathconf(path, 6);
  285.  
  286.     /* MagiCPC 6.0 meldet 0, das ist aber falsch!! */
  287.     if (cf_magxPC && ret == 0)
  288.         ret = 2;
  289.  
  290.     switch (ret)
  291.     {
  292.         case 0 :                /* echter Unterschied, MinixFS */
  293.             ret = FULL_CASE;
  294.             break;
  295.         case 2 :                /* kein echter Unterschied, VFAT, MacFS */
  296.             ret = HALF_CASE;
  297.             break;
  298.         default:
  299.             ret = NO_CASE;        /* Dpathconf() nicht verfügbar, oder kein Unterschied */
  300.     }
  301.     return ret;
  302. }
  303.